home *** CD-ROM | disk | FTP | other *** search
- /*
- * Copyright (C) 1994, Silicon Graphics, Inc.
- * All Rights Reserved.
- *
- * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
- * the contents of this file may not be disclosed to third parties, copied or
- * duplicated in any form, in whole or in part, without the prior written
- * permission of Silicon Graphics, Inc.
- *
- * RESTRICTED RIGHTS LEGEND:
- * Use, duplication or disclosure by the Government is subject to restrictions
- * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
- * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
- * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
- * rights reserved under the Copyright Laws of the United States.
- */
- #include <stdio.h>
- #include "TimeSlot.h"
- #include "Utils.h"
- #include "Preferences.h"
-
- #include <Xm/Form.h>
- #include <Xm/PushB.h>
- #include <Xm/Text.h>
-
- static Arg args[10];
- static int count;
-
- static String newTranslations =
- "Shift<Key>Return: activate()\n\
- ";
-
- void
- TimeSlot::text_activate(Widget, XtPointer client_data, XtPointer call_data)
- {
- TimeSlot *obj = (TimeSlot *) client_data;
- XmAnyCallbackStruct *cb = (XmAnyCallbackStruct *) call_data;
-
- obj->textChanged();
- obj->traversal(cb->event);
- }
-
- void
- TimeSlot::text_focus_lost(Widget, XtPointer client_data, XtPointer)
- {
- TimeSlot *obj = (TimeSlot *) client_data;
-
- if (obj->_dirty) {
- obj->textChanged();
- }
- }
-
- void
- TimeSlot::text_modify(Widget, XtPointer client_data, XtPointer)
- {
- TimeSlot *obj = (TimeSlot *) client_data;
-
- obj->_dirty = True;
- }
-
- void
- TimeSlot::date_select(Widget, XtPointer client_data, XtPointer)
- {
- TimeSlot *obj = (TimeSlot *) client_data;
-
- if (obj->dateSelectEnabled) {
- obj->dateSelect();
- }
- }
-
- /**********************************************************************/
-
- void
- TimeSlot::build(Widget parent)
- {
- count = 0;
- _baseWidget = XmCreateForm(parent, "timeSlot", args, count);
-
- count = 0;
- XtSetArg(args[count], XmNtopAttachment, XmATTACH_FORM); count++;
- XtSetArg(args[count], XmNleftAttachment, XmATTACH_FORM); count++;
- XtSetArg(args[count], XmNbottomAttachment, XmATTACH_FORM); count++;
- dateButton = XmCreatePushButton(_baseWidget, "dateButton", args, count);
- XtManageChild(dateButton);
- XtAddCallback(dateButton, XmNactivateCallback,
- (XtCallbackProc) TimeSlot::date_select,
- (XtPointer) this);
-
- count = 0;
- XtSetArg(args[count], XmNtopAttachment, XmATTACH_FORM); count++;
- XtSetArg(args[count], XmNleftAttachment, XmATTACH_WIDGET); count++;
- XtSetArg(args[count], XmNleftWidget, dateButton); count++;
- XtSetArg(args[count], XmNrightAttachment, XmATTACH_FORM); count++;
- text = XmCreateText(_baseWidget, "text", args, count);
- XtManageChild(text);
- XtAddCallback(text, XmNactivateCallback,
- (XtCallbackProc) TimeSlot::text_activate,
- (XtPointer) this);
- XtAddCallback(text, XmNlosingFocusCallback,
- (XtCallbackProc) TimeSlot::text_focus_lost,
- (XtPointer) this);
- XtAddCallback(text, XmNmodifyVerifyCallback,
- (XtCallbackProc) TimeSlot::text_modify,
- (XtPointer) this);
- XtOverrideTranslations(text, XtParseTranslationTable(newTranslations));
-
- afterSwitchScheme();
-
- XtManageChild(_baseWidget);
-
- redisplay();
- }
-
- void
- TimeSlot::setTimeInterval(int s, int l)
- {
- if (_start != s || _length != l) {
- _start = s;
- _length = l;
- if (_baseWidget) {
- redisplay();
- }
- }
- }
-
- void
- TimeSlot::setCallback(XtCallbackProc proc, XtPointer client_data)
- {
- callback = proc;
- callbackData = client_data;
- }
-
- char *
- TimeSlot::getText()
- {
- return XmTextGetString(text);
- }
-
- void
- TimeSlot::setText(char *str)
- {
- char *current;
-
- current = XmTextGetString(text);
- if (strcmp(str, current)) {
- XmTextSetString(text, str);
- }
- XtFree(current);
- _dirty = False;
- }
-
- void
- TimeSlot::enableDateSelect()
- {
- dateSelectEnabled = True;
- count = 0;
- XtSetArg(args[count], XmNtopShadowColor, dateTop); count++;
- XtSetArg(args[count], XmNbottomShadowColor, dateBottom); count++;
- XtSetArg(args[count], XmNbackground, dateBg); count++;
- XtSetArg(args[count], XmNarmColor, dateArm); count++;
- XtSetValues(dateButton, args, count);
- }
-
- void
- TimeSlot::disableDateSelect()
- {
- dateSelectEnabled = False;
- count = 0;
- XtSetArg(args[count], XmNtopShadowColor, normalBg); count++;
- XtSetArg(args[count], XmNbottomShadowColor, normalBg); count++;
- XtSetArg(args[count], XmNbackground, normalBg); count++;
- XtSetArg(args[count], XmNarmColor, normalBg); count++;
- XtSetValues(dateButton, args, count);
- }
-
- void
- TimeSlot::afterSwitchScheme()
- {
- count = 0;
- XtSetArg(args[count], XmNbackground, &normalBg); count++;
- XtGetValues(_baseWidget, args, count);
- count = 0;
- XtSetArg(args[count], XmNtopShadowColor, &dateTop); count++;
- XtSetArg(args[count], XmNbottomShadowColor, &dateBottom); count++;
- XtSetArg(args[count], XmNbackground, &dateBg); count++;
- XtSetArg(args[count], XmNarmColor, &dateArm); count++;
- XtGetValues(dateButton, args, count);
- if (dateSelectEnabled) {
- enableDateSelect();
- } else {
- disableDateSelect();
- }
- }
-
- void
- TimeSlot::setTextFocus()
- {
- XmProcessTraversal(text, XmTRAVERSE_CURRENT);
- }
-
- /**********************************************************************/
-
- void
- TimeSlot::redisplay()
- {
- XmString xs;
- char str[256];
-
- formatTime(_start / 60, _start % 60, thePreferences->clock24(), str);
- xs = XmStringCreateSimple(str);
- count = 0;
- XtSetArg(args[count], XmNlabelString, xs); count++;
- XtSetValues(dateButton, args, count);
- XmStringFree(xs);
- }
-
- void
- TimeSlot::textChanged()
- {
- TimeSlotCallback data;
- char *str;
-
- _dirty = False;
- if (callback) {
- str = getText();
- data.obj = this;
- if (strlen(str)) {
- data.reason = TS_textChanged;
- } else {
- data.reason = TS_textCleared;
- }
- (*callback)(text, callbackData, (XtPointer) &data);
- XtFree(str);
- }
- }
-
- void
- TimeSlot::dateSelect()
- {
- TimeSlotCallback data;
-
- if (callback) {
- data.obj = this;
- data.reason = TS_dateSelect;
- (*callback)(text, callbackData, (XtPointer) &data);
- }
- }
-
- void
- TimeSlot::traversal(XEvent *event)
- {
- char key;
- TimeSlotCallback data;
-
- if (event->type == KeyPress) {
- XLookupString((XKeyEvent *) event, &key, 1, NULL, NULL);
- if (key == '\r') {
- if (callback) {
- data.obj = this;
- data.reason = (event->xkey.state & ShiftMask) ?
- TS_traverseBackward : TS_traverseForward;
- (*callback)(text, callbackData, (XtPointer) &data);
- }
- }
- }
- }
-
- /**********************************************************************/
-
- TimeSlot::TimeSlot()
- : VkComponent()
- {
- _start = _length = 0;
- callback = NULL;
- callbackData = NULL;
- _dirty = False;
- _data = NULL;
- dateSelectEnabled = False;
- }
-
- TimeSlot::~TimeSlot()
- {
- XtRemoveCallback(dateButton, XmNactivateCallback,
- (XtCallbackProc) TimeSlot::date_select,
- (XtPointer) this);
- XtRemoveCallback(text, XmNactivateCallback,
- (XtCallbackProc) TimeSlot::text_activate,
- (XtPointer) this);
- XtRemoveCallback(text, XmNlosingFocusCallback,
- (XtCallbackProc) TimeSlot::text_focus_lost,
- (XtPointer) this);
- XtRemoveCallback(text, XmNmodifyVerifyCallback,
- (XtCallbackProc) TimeSlot::text_modify,
- (XtPointer) this);
- }
-
- const char *
- TimeSlot::className()
- {
- return "TimeSlot";
- }
-